名字空间和C

  考虑常规的第一个C程序

    #include <stdio.h>
    int main()
    {
        printf("Hello,world!\n");
    }

打破这个程序当然不是一个好主意。将标准库当做特例同样也不是好主意。因此,语言对名字空间的规则采用了这样一种设计,对一个没有用名字空间的程序,将它转换为使用名字空间的更清晰结构的过程相对来说比较容易完成。事实上,计算器程序(6.1节)也就是这样的一个例子。

  使用指令是达到这一点的关键。例如,标准C中来自C头文件stdio.h的I/O功能被包裹在如下形式的名字空间里:

    // stdio.h:
        namespace std {
            int printf(const char* ...);
            // ...
        }
        using namespace std;

这样就得到了向后兼容性。还有,这里又定义了一个新头文件cstdio,提供给那些不希望一大批名字都能隐式地随便使用的人们:

    cstdio:
        namespace std {
            int printf(const char* ...);
            // ...
        }

当然,担心重复声明问题的C++标准库实现者可以通过包含cstdio的方式实现stdio.h:

    #include <cstdio>
    using std::printf;
    // ...

我基本上把非局部的使用指令只看做是一种转变的工具。引用了来自其他名字空间中各种名字的代码,大都能够通过显式的限定和使用声明表述得更加清晰。

  关于名字空间和连接之间的关系将在9.2.4节描述。

🔚